import java.io.*;
import de.htw.saarland.stl.*; 
/**
 * Beschreiben Sie hier die Klasse DialogAuftragsverwaltung.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class DialogSuchBaum{
    private static final char   INSERT      ='+';
    private static final char   REMOVE      ='-';
    private static final int    ERSTER_CHAR = 0 ;
    private static final char   JA          ='j';
    private static final char   NEIN        ='n';
    private static final String SPLIT       ="\t";

    private static final String ARRAY_GROESSE_TEXT = "Bitte die Groesse des Arrays angeben: ";
    private static final String DATEINAME_EINGEBEN = "Bitte geben Sie den Namen der Datei ein,\n"+
        "von der eingelesen werden soll: ";

    private static final String EXISTS       = "Datei ist nicht vorhanden!";
    private static final String IS_DIRECTORY = "Der angegebene Pfad fuehrt zu keiner Datei";
    private static final String IS_FILE      = "Ist keine Datei!";
    private static final String READABLE     = "Keine Leserecht vorhanden!";
    private static final String WRONG_INPUT  = "Falsche Eingabe, bitte erneut versuchen!";
    private static final String LEERZEILE    = "Leerzeile gefunden!";
    private static final String WRONG_OPERATOR = "Operator nicht erkannt!"; 
    private static final String GROESSE_VORGEBEN = "Wollen Sie die Groesse des Arrays vorgeben? \n"+
        "["+JA+"/"+NEIN+"]: ";
    private static final String INTRO = "Programm zum Einlesen und automatischer Verwaltung\n"+
        "einer Datei mit Angaben in der Form\n"+
        "\"Steuerzeichen[Auftragsnummer]<tab>[AuftagsGeber]\"";

    Auftragsverwaltung warteschlange;
    private static DialogAuftragsverwaltung dialog;
    private File datei;

    public DialogSuchBaum (String dateiName)throws DateiException{
        warteschlange = new Auftragsverwaltung();
        datei = new File(dateiName);
        dateiCheck(datei);
        System.out.println("Warteschlange mit Kapazitaet "+warteschlange.size()+
            " wurde angelegt.");
    }

    public DialogSuchBaum (String dateiName, int size)throws DateiException{
        warteschlange = new Auftragsverwaltung(size);
        datei = new File(dateiName);
        dateiCheck(datei);
        System.out.println("Warteschlange mit Kapazitaet "+warteschlange.size()+
            " wurde angelegt.");
    }

    public void dateiCheck(File datei)throws DateiException
    {
        if(!datei.exists()) 
            throw new DateiException(EXISTS);
        if(datei.isDirectory()) 
            throw new DateiException(IS_DIRECTORY);   
        if(!datei.isFile()) 
            throw new DateiException(IS_FILE);
        if(!datei.canRead()) 
            throw new DateiException(READABLE);
    }

    private static void auswaehlen() throws Exception{
        int groesse;
        char auswahl ='x';
        boolean ausgefuehrt = false;
        String dateiName;

        while (!ausgefuehrt) {                          
            try{
                auswahl = Stdin.readlnChar(GROESSE_VORGEBEN);
                switch (auswahl){
                    case JA :
                    groesse = Stdin.readlnInt(ARRAY_GROESSE_TEXT);
                    dateiName = Stdin.readlnString(DATEINAME_EINGEBEN);            
                    dialog = new DialogAuftragsverwaltung(dateiName,groesse);
                    dialog.verarbeiten();
                    ausgefuehrt = true;
                    break;

                    case NEIN:
                    dateiName = Stdin.readlnString(DATEINAME_EINGEBEN);            
                    dialog = new DialogAuftragsverwaltung(dateiName);
                    System.out.println();
                    dialog.verarbeiten();
                    ausgefuehrt = true;
                    break; 

                    default:
                    System.out.println(WRONG_INPUT);
                    break;
                }

            } catch (Exception e) {
                System.err.println(e);
            } 
        }
        ausgefuehrt = true;
    }

    public void verarbeiten() throws Exception{
        LineNumberReader reader = new LineNumberReader(new FileReader(datei));
        String zeile = null;

        int auftragsNummer;
        String auftragsGeber;

        Object entferntesObjekt;
        while ((zeile = reader.readLine()) != null)
        { try
            {
                if(zeile.isEmpty()){
                    //System.out.println("Zeile "+reader.getLineNumber()+
                    //                   " ist eine Leerzeile!\n");
                    throw new OperationException(LEERZEILE);
                }else if (zeile.trim().charAt(ERSTER_CHAR) == INSERT){   
                    System.out.println("Zeile "+reader.getLineNumber()+" mit Inhalt: "
                        +zeile+" wurde eingelesen\n");
                    String[] aufgeteilt = aufteilen(zeile); 
                    auftragsNummer = Integer.parseInt( aufgeteilt[0] );
                    auftragsGeber  = aufgeteilt[1];
                    auftragsGeber = auftragsGeber.trim();
                    warteschlange.insert(
                        new Auftrag(auftragsNummer, auftragsGeber)
                    );
                    System.out.println(warteschlange);
                    //                 }else if (zeile.charAt(ERSTER_CHAR) == REMOVE){
                    //                     entferntesObjekt = warteschlange.remove();
                    //                     System.out.println("Folgender Auftrag\n"+ entferntesObjekt +
                    //                                        "wurde entfernt\n");
                    //                     System.out.println(warteschlange);

                }else 
                    throw new OperationException(WRONG_OPERATOR);
            } catch (QueueException e) {
                System.err.println("Fehler in Zeile "+reader.getLineNumber()+":\n"+ e);
            } catch (Exception e) {
                System.err.println("Fehler in Zeile "+reader.getLineNumber()+":\n"+ e);
            }
        }
        reader.close();
    }

    public String[] aufteilen(String zeile){
        zeile = zeile.trim();
        String[] aufgeteilt = zeile.split(SPLIT);
        return aufgeteilt;
    }

    public static void main (String[] args){
        System.out.println(INTRO);
        try {
            auswaehlen();
        } catch (Exception e) {
            System.err.println(e);
        }      

    }
}
